#include <iostream>
#include<functional>  //包装器的头文件
#include<map>
using namespace std;

//int f(int a, int b)
//{
//    return a + b;
//}
//struct Functor
//{
//public:
//    int operator() (int a, int b)
//    {
//        return a + b;
//    }
//};
//class Plus
//{
//public:
//    static int plusi(int a, int b)
//    {
//        return a + b;
//    }
//    double plusd(double a, double b)
//    {
//        return a + b;
//    }
//};
//int main()
//{
//    map<string, int> mp = { {"sort",1},{"string",2} };  //用inlizerlist初始化
//    cout<<mp.count("sort") << endl;
//    mp["sort"];
//    //function<double(double, double)> f1 = [](double x, double y)->double {return x + y; };
//    //cout << f1(1.1, 1.2) << endl;
//    function<int(int, int)> f1 = f; //传入的必须是个函数指针或者对象或者lambda表达式
//    cout << f1(1, 2) << endl;
//    function<int(int, int)> f2 = Functor();//必须是调用这样，或者构造出一个对象进行包装
//    cout << f2(1, 2) << endl;
//
//    //function<int(int, int)> f2(Functor());//不能够这样调用
//    //cout << f2(1, 2) << endl;
//    Functor func;
//    function<int(int, int)> f3(func);//构造出一个对象进行包装
//    cout << f3(1, 2) << endl;
//    //对于类类型的适配，必须要传入类型
//    function<int(Plus,int, int)> f4 = &Plus::plusd;   //对于非静态成员函数的调用,建议都不省略
//    cout << f4(Plus(),1, 2)<<endl;
//    function<int(int, int)> f5 = &Plus::plusi;   //对于静态函数的调用,不写Plus对象 ，对于&可省略，但最好写上保持一致
//    cout << f5(1, 2) << endl;
//
//    return 0;
//}


//template<class F, class T>
//T useF(F f, T x)
//{
//	static int count = 0;
//	cout << "count:" << ++count << endl;
//	cout << "count:" << &count << endl;
//	return f(x);
//}
//double f(double i)
//{
//	return i / 2;
//}
//struct Functor
//{
//	double operator()(double d)
//	{
//		return d / 3;
//	}
//};
//int main()
//{
//
//	//cout << useF(f, 2) << endl;
//	//cout << useF(Functor(), 2) << endl;
//
//	//cout << useF([](int x)->int {return x; }, 2) << endl;
//
//
//	// 函数名
//	function<double(double)> func1 = f;
//	cout << useF(func1, 11.11) << endl;
//	// 函数对象
//	function<double(double)> func2 = Functor();
//	cout << useF(func2, 11.11) << endl;
//	// lamber表达式
//	function<double(double)> func3 = [](double d)->double { return d /4; };
//	cout << useF(func3, 11.11) << endl;
//	return 0;
//}



/////////////bind  绑定  也是一个函数包装器
//
//int Plus(int a, int b)
//{
//	return a + b;
//}
//class Sub
//{
//public:
//	int sub(int a, int b)
//	{
//		return a - b;
//	}
//};
//
//int main()
//{
//	////表示绑定函数plus 参数分别由调用 func1 的第一，二个参数指定
//	function<int(int, int)> f1 = bind(Plus, placeholders::_1, placeholders::_2);
//	cout << f1(1,2) << endl;
//
//
//	//绑定成员函数
//	function<int(int, int)> f2 = bind(&Sub::sub,Sub(), placeholders::_1, placeholders::_2);
//	cout << f2(10, 5) << endl;
//	//也可以通过更换placeholders::_1, placeholders::_2的位置，来调换
//
//	function<int(int, int)> f3 = bind(&Sub::sub, Sub(), placeholders::_2, placeholders::_1);
//	cout << f3(10, 5) << endl;
//
//
//	function<bool(int, int)> gt = bind(less<int>(), placeholders::_1, placeholders::_2);  //这里是比较大小
//	cout << gt(1, 2) << endl;
//
//
//	function<bool(int, int)> ls = bind(less<int>(), placeholders::_2, placeholders::_1);  //这里是比较大小
//	cout << ls(1, 2) << endl;
//
//	return 0;
//}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//try  --catch
//异常捕获
//double Division(int a, int b)
//{
//    // 当b == 0时抛出异常    
//    if (b == 0)
//        throw "Division by zero condition!";    //这里throw的异常类型，要跟catch的异常类型匹配，如果都没匹配到就会报错 
//    else
//        return ((double)a / (double)b);
//}
//void Func()
//{
//    int len, time;
//    cin >> len >> time;
//    cout << Division(len, time) << endl;
//}
//int main()
//{
//    try {
//        Func();
//         }
//    catch (const char* errmsg){
//            cout << errmsg << endl;
//        }
//        //catch (...)     //catch ...   是捕获所有类型的异常
//        //{
//        //    cout << "unkown exception" << endl;
//        //}
//        return 0; 
//}



double Division(int a, int b)
{
	// 当b == 0时抛出异常
	if (b == 0)
	{
		throw "Division by zero condition!";
	}
	return (double)a / (double)b;
}
void Func()
{
	// 这里可以看到如果发生除0错误抛出异常，另外下面的array没有得到释放。
	// 所以这里捕获异常后并不处理异常，异常还是交给外面处理，这里捕获了再
	// 重新抛出去。
	int* array = new int[10];
	try {
		int len, time;
		cin >> len >> time;
		cout << Division(len, time) << endl;
	}
	catch (...)
	{
		cout << "delete []" << array << endl;
		delete[] array;
		throw;
	}
	// ...
	cout << "delete []" << array << endl;
	delete[] array;
}
int main()
{
	try
	{
		Func();
	}
	catch (const char* errmsg)
	{
		cout << errmsg << endl;
	}
	return 0;
}
